/*
 * FileName:    charChange.java
 * Description: 文字変換
 * History:     2010-11-15 (李璐超) 1.0 Create
 */
package com.sn.system.common.utils;

import com.sun.xml.internal.bind.v2.runtime.property.Property;

public class charChange {
	public static String filter(String value) {
        if (value == null) {
            return null;
        }        
        StringBuffer result = new StringBuffer(value.length());
        for (int i=0; i<value.length(); ++i) {
            switch (value.charAt(i)) {
            case '<':
                result.append("&lt;");
                break;
            case '>': 
                result.append("&gt;");
                break;
            case '"': 
                result.append("&quot;");
                break;
            case '\'': 
                result.append("&#39;");
                break;
            case '%': 
                result.append("&#37;");
                break;
            case ';': 
                result.append("&#59;");
                break;
//            case '(': 
//                result.append("&#40;");
//                break;
//            case ')': 
//                result.append("&#41;");
//                break;
            case '&': 
                result.append("&amp;");
                break;
            case '+':
                result.append("&#43;");
                break;
            default:
                result.append(value.charAt(i));
                break;
        }                
        }
        return result.toString();
	}
	
	 /**
	  * 半角カナ文字を全角カナ文字へ変換します。
	  * 1つ目の引数は変換の対象となる文字です。
	  * 2つ目の引数は、変換の対象となる文字の1つ前の文字です。変換の対象となる文字が濁点('ﾞ')もしくは半濁点('ﾟ')であった場合、
	  * 1つ前の文字を判別し、全角1文字で表現できる場合はそれを使用します。<br>
	  * ＜例＞
	  * ｶﾞ → ガ
	  * ｳﾞ → ヴ
	  * ｱﾞ → ア゛
	  * @param targetCharacter 全角カナ文字への変換対象文字
	  * @param beforeTarget 変換対象文字の1つ前の文字
	  * @return char 変換後文字
	  */
	public static char toFullKana(char targetCharacter,char beforeTarget){
		  final char kanaArry[][] = {{'｡','。'},{'｢','「'},{'｣','」'},{'､','、'},{'･','・'},   //半角カナと全角カナの対応表を格納
		         {'ｦ','ヲ'},{'ｧ','ァ'},{'ｨ','ィ'},{'ｩ','ゥ'},{'ｪ','ェ'},
		         {'ｫ','ォ'},{'ｬ','ャ'},{'ｭ','ュ'},{'ｮ','ョ'},{'ｯ','ッ'},
		         {'ｰ','ー'},{'ｱ','ア'},{'ｲ','イ'},{'ｳ','ウ'},{'ｴ','エ'},
		         {'ｵ','オ'},{'ｶ','カ'},{'ｷ','キ'},{'ｸ','ク'},{'ｹ','ケ'},
		         {'ｺ','コ'},{'ｻ','サ'},{'ｼ','シ'},{'ｽ','ス'},{'ｾ','セ'},
		         {'ｿ','ソ'},{'ﾀ','タ'},{'ﾁ','チ'},{'ﾂ','ツ'},{'ﾃ','テ'},
		         {'ﾄ','ト'},{'ﾅ','ナ'},{'ﾆ','ニ'},{'ﾇ','ヌ'},{'ﾈ','ネ'},
		         {'ﾉ','ノ'},{'ﾊ','ハ'},{'ﾋ','ヒ'},{'ﾌ','フ'},{'ﾍ','ヘ'},
		         {'ﾎ','ホ'},{'ﾏ','マ'},{'ﾐ','ミ'},{'ﾑ','ム'},{'ﾒ','メ'},
		         {'ﾓ','モ'},{'ﾔ','ヤ'},{'ﾕ','ユ'},{'ﾖ','ヨ'},{'ﾗ','ラ'},
		         {'ﾘ','リ'},{'ﾙ','ル'},{'ﾚ','レ'},{'ﾛ','ロ'},{'ﾜ','ワ'},
		         {'ﾝ','ン'},{'ﾞ','゛'},{'ﾟ','゜'}};
		  final char voicedArry[][] = {{'ｶ','ガ'},{'ｷ','ギ'},{'ｸ','グ'},{'ｹ','ゲ'},{'ｺ','ゴ'},  //半角カナと全角カナと全角濁音カナの対応表を格納
		         {'ｻ','ザ'},{'ｼ','ジ'},{'ｽ','ズ'},{'ｾ','ゼ'},{'ｿ','ゾ'},
		         {'ﾀ','ダ'},{'ﾁ','ヂ'},{'ﾂ','ヅ'},{'ﾃ','デ'},{'ﾄ','ド'},
		         {'ﾊ','バ'},{'ﾋ','ビ'},{'ﾌ','ブ'},{'ﾍ','ベ'},{'ﾎ','ボ'},
		         {'ｳ','ヴ'}};
		  final char semivoicedArry[][] = {{'ﾊ','パ'},{'ﾋ','ピ'},{'ﾌ','プ'},{'ﾍ','ペ'},{'ﾎ','ポ'}}; //半角カナと全角カナと全角半濁音カナの対応表を格納

		  //半角カナの種類数分ループさせる
		  for(int i = 0; i < kanaArry.length; i++){
		   if(targetCharacter == kanaArry[kanaArry.length - 2][0]){  //文字が濁点('ﾞ')であった場合
		    //全角濁音カナの種類数分ループさせる
		    for(int k = 0; k < voicedArry.length; k++){
		     if(beforeTarget == voicedArry[k][0]){ //対象文字列の半角カナと全角濁音カナ対応表の半角カナが一致した場合
		      return voicedArry[k][1];   //文字列バッファに全角濁点カナを格納
		     }
		     if(k == voicedArry.length -1){   //対応する全角濁音カナがなかった場合
		      return kanaArry[kanaArry.length - 2][1];  //文字列バッファに全角濁点を格納
		     }
		    }
		   }else if(targetCharacter == kanaArry[kanaArry.length - 1][0]){ //文字が半濁点('ﾟ')であった場合
		    //全角半濁音カナの種類数分ループさせる
		    for(int k = 0; k < semivoicedArry.length; k++){
		     if(beforeTarget == semivoicedArry[k][0]){ //対象文字列の半角カナと全角半濁音カナ対応表の半角カナが一致した場合
		      return semivoicedArry[k][1];  //文字列バッファに全角半濁点カナを格納
		     }
		     if(k == semivoicedArry.length - 1){   //対応する全角半濁音カナがなかった場合
		      return kanaArry[kanaArry.length - 1][1];  //文字列バッファに全角半濁点を格納
		     }
		    }
		   }else if(targetCharacter == kanaArry[i][0]){
		    return kanaArry[i][1];  //半角カナを対応する全角カナに変換
		   }
		  }
		  return targetCharacter;
		 }

	/**
	  * 渡された文字列の英数字カナ半角文字を全角文字にします。
	  * @param targetString 変換対象文字列
	  * @return String 変換後の文字列
	  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
	  */
	 public static String toFullChar(String targetString) throws IllegalArgumentException{
	  StringBuffer fullCharStr;     //文字列編集用
	  char fullKana;

	  //引数チェック
	  if(targetString == null){
	   throw new IllegalArgumentException();  //引数がnullの場合、
	              //IllegalArgumentExceptionをスロー
	  }
	  fullCharStr = new StringBuffer(targetString.length()); //変換対象文字数分の文字列編集用バッファを取得

	  //文字列中の半角英数字カナ文字を全角文字に変換する
	  for(int i = 0; i < targetString.length(); i++){
	   if(targetString.substring(i, i+1).matches("[ -~]")){
	    fullCharStr.append(toFullAlphameric(targetString.charAt(i)));    //文字が半角英数字であった場合、
	                        //全角英数字へ変換
	   }else if(targetString.substring(i, i+1).matches("[｡-ﾟ]")){
	    fullKana = toFullKana(targetString.charAt(i),targetString.charAt(i - 1)); //文字が半角カナであった場合、
	                        //全角カナ文字へ変換
	    if(fullKana != '゛' && fullKana != '゜' && (targetString.charAt(i) == 'ﾞ' || targetString.charAt(i) == 'ﾟ')){
	     fullCharStr.deleteCharAt(fullCharStr.length()-1);        //変換対象文字が半角濁点もしくは半角半濁点かつ
	                          //変換後の文字が全角濁点・全角半濁点ではない場合、
	                          //1つ前に格納されている文字を削除
	    }
	    fullCharStr.append(fullKana);              //変換後の文字列を格納
	   }

	  }
	  return fullCharStr.toString();
	 }

	/**
	  * 文字列中の半角小文字を半角大文字に変換します。
	  * 渡された文字列中の半角小文字を半角大文字に変換し、変換した文字列を戻します。
	  * @param convertString 変換対象文字列
	  * @return String 変換後の文字列
	  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
	  */
	public static String convertCapitalLetter(String convertString){
		 // int index;
		  String before[] = {"ｧ","ぁ","ｨ","ぃ","ｩ","ぅ","ｪ","ぇ","ｫ","ぉ","ｬ","ゃ","ｭ","ゅ","ｮ","ょ","ｯ","っ","ゎ","\""}; //変換前の半角小文字を格納した配列
		  String after[] = {"ｱ","あ","ｲ","い","ｳ","う","ｴ","え","ｵ","お","ﾔ","や","ﾕ","ゆ","ﾖ","よ","ﾂ","つ","わ","ﾞ"};  //変換後の半角大文字を格納した配列
		  StringBuffer stringBuffer = new StringBuffer(convertString); //文字列編集用

		  //変換対象となる半角小文字の数だけループ
		  for( int i = 0; i < 20; i++){
//		   index = 0;  //indexを初期化
//		   //文字列中に変換対象となる半角小文字がある間ループ
//		   while(index >= 0){
//		    index = stringBuffer.indexOf( before[i], index);  //半角小文字が最初に出現する位置のインデックスを取得
//		    if(index >= 0){
//		     stringBuffer.replace( index, index + 1, after[i]); //半角小文字が見つかった場合
//		                  //半角小文字を半角大文字に変換
//		    }
//		   }
		   for(int j= 0;j<stringBuffer.length();j++)
		   {
			   if(String.valueOf(stringBuffer.charAt(j)).equals(before[i])){
				   char a[]=after[i].toCharArray();
				   	stringBuffer.setCharAt(j,a[0]);
			   }
		   }
		 }
		return stringBuffer.toString();
	}

	/**
	  * 文字列中の全角小文字を全角大文字に変換します。
	  * 渡された文字列中の全角小文字を全角大文字に変換し、変換した文字列を戻します。
	  * @param convertString 変換対象文字列
	  * @return String 変換後の文字列
	  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
	  */
	public static String convertFullLetter(String convertString){
		  int index;
		  String before[] = {"ァ","ぁ","ィ","ぃ","ゥ","ぅ","ェ","ぇ","ォ","ぉ","ャ","ゃ","ュ","ゅ","ョ","ょ","ッ","っ","ゎ","\""}; //変換前の全角小文字を格納した配列
		  String after[] = {"ア","あ","イ","い","ウ","う","エ","え","オ","お","ヤ","や","ユ","ゆ","ヨ","よ","ツ","つ","わ","ﾞ"};  //変換後の全角大文字を格納した配列
		  StringBuffer stringBuffer = new StringBuffer(convertString); //文字列編集用

		  //変換対象となる全角小文字の数だけループ
		  for( int i = 0; i < 20; i++){
		   index = 0;  //indexを初期化
		   //文字列中に変換対象となる全角小文字がある間ループ
		   while(index >= 0){
		    index = stringBuffer.indexOf( before[i], index);  //全角小文字が最初に出現する位置のインデックスを取得
		    if(index >= 0){
		     stringBuffer.replace( index, index + 1, after[i]); //全角小文字が見つかった場合
		                  //全角小文字を全角大文字に変換
		    }
		   }
		 }
		return stringBuffer.toString();
	}
	/**
	  * 文字列中の全角濁点を全角文字に変換します。
	  * @param convertString 変換対象文字列
	  * @return String 変換後の文字列
	  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
	  */
	public static String convertSonant(String convertString){
		if(convertString==null||convertString.equals("")){
			return convertString;
		}
		  int index;
		  String before[] = {"が","ガ","ぎ","ギ","ぐ","グ","げ","ゲ","ご","ゴ","ざ","ザ","じ","ジ","ず","ズ","ぜ","ゼ","ぞ","ゾ","だ","ダ","ぢ","ヂ","づ","ヅ","で","デ","ど","ド","ば","バ","び","ビ","ぶ","ブ","べ","ベ","ぼ","ボ","\""}; //変換前の全角濁点、半濁点を格納した配列
		  String after[] = {"か","カ","き","キ","く","ク","け","ケ","こ","コ","さ","サ","し","シ","す","ス","せ","セ","そ","ソ","た","タ","ち","チ","つ","ツ","て","テ","と","ト","は","ハ","ひ","ヒ","ふ","フ","へ","ヘ","ほ","ホ","ﾞ"};  //変換後の全角文字を格納した配列
		  StringBuffer stringBuffer = new StringBuffer(convertString); //文字列編集用

		  //変換対象となる全角濁点、半濁点の数だけループ
		  for( int i = 0; i < 41; i++){
		   index = 0;  //indexを初期化
		   //文字列中に変換対象となる全角文字がある間ループ
		   while(index >= 0){
		    index = stringBuffer.indexOf( before[i], index);  //全角濁点、半濁点が最初に出現する位置のインデックスを取得
		    if(index >= 0){
		     stringBuffer.replace( index, index + 1, after[i]); //全角濁点、半濁点が見つかった場合
		                  //全角濁点、半濁点を全角文字に変換
		    }
		   }
		 }
		return stringBuffer.toString();
	}
	/**
	  * 文字列中の全角半濁点を全角文字に変換します。
	  * @param convertString 変換対象文字列　パピプペポ
	  * @return String 変換後の文字列
	  * @throws java.lang.IllegalArgumentException 不正な引数、もしくは不適切な引数が渡された場合に例外がスローされます。
	  */
	public static String convertＨalfvoiced(String convertString){
		if(convertString==null||convertString.equals("")){
			return convertString;
		}
		  int index;
		  String before[] = {"ぱ","パ","ぴ","ピ","ぷ","プ","ぺ","ペ","ぽ","ポ","\""}; //変換前の全角濁点、半濁点を格納した配列
		  String after[] = {"は","ハ","ひ","ヒ","ふ","フ","へ","ヘ","ほ","ホ","ﾞ"};  //変換後の全角文字を格納した配列
		  StringBuffer stringBuffer = new StringBuffer(convertString); //文字列編集用
		  //変換対象となる全角濁点、半濁点の数だけループ
		  for( int i = 0; i < 11; i++){
		   index = 0;  //indexを初期化
		   //文字列中に変換対象となる全角文字がある間ループ
		   while(index >= 0){
		    index = stringBuffer.indexOf( before[i], index);  //全角濁点、半濁点が最初に出現する位置のインデックスを取得
		    if(index >= 0){
		     stringBuffer.replace( index, index + 1, after[i]); //全角濁点、半濁点が見つかった場合
		                  //全角濁点、半濁点を全角文字に変換
		    }
		   }
		 }
		return stringBuffer.toString();
	}

	/**
	  * 半角英数字を全角英数字へ変換します。
	  * @param targetCharacter 全角英数字への変換対象文字
	  * @return char 変換後文字
	  */
	 private static char toFullAlphameric(char targetCharacter){
	  final int E_DIFFERENCE = 0xff01 - 0x0021; //英数字の全角文字と半角文字のUnicodeの差

	  switch(targetCharacter){
	  case 0x0020:
	   return 0x3000;    //' '(Unicode：0x0021)を'　'(Unicode：0x3000)に変換
	  case 0x0022:
	   return 0x201d;    //'"'(Unicode：0x0022)を'”'(Unicode：0x201d)に変換
	  case 0x0027:
	   return 0x2019;    //'''(Unicode：0x0027)を'’'(Unicode：0x2019)に変換
	  case 0x005c:
	   return 0xffe5;    //'\'(Unicode：0x005c)を'￥'(Unicode：0xffe5)に変換
	  default:
	   targetCharacter += E_DIFFERENCE; //上記以外の半角英数字を対応する全角英数字に変換(順に並んでいる為、
	            //半角英数字と全角英数字の差を半角英数字に加えることで可能)
	   return targetCharacter;
	  }
	 }

 }
